home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / pfrank / PFrankSetupSVN1.95.exe / {app} / PFrankUser.py.template < prev    next >
Text File  |  2007-04-09  |  12KB  |  336 lines

  1. #!/usr/bin/python
  2.  
  3. """ 
  4. This file is used to create the user defined commands.
  5.  
  6. The procedure for creating the commands is summarized as follows:
  7.  
  8. 1)
  9. Create a class for the command using the defined API
  10. Sample classes are provided.  The samples are meticulously commented,
  11. 2)
  12. Insert a line corresponding to your command in the UserRenamerList near the
  13. end of this file (Don't forget the parentheses!). 
  14. 3)
  15. You then use the PFrank GUI to load the command objects from the list.
  16.  
  17. This module is written in the Python scripting language.  You will therefore
  18. have to learn some Python programming.  Don't worry - it's a very easy language
  19. to use.
  20.  
  21. An Extremely useful tutorial can be found at: 
  22.     http://www.python.org/doc/current/tut/node2.html
  23.  
  24. You don't have to do this but it is highly recommended to download the python 
  25. interpreter from http://www.python.org/doc/current/tut/node2.html
  26.  
  27. The page provides a 'Download' button that leads you to an exe file.
  28. Once installed, you can use the IDLE feature to pre-test this module to
  29. ensure it does what you want.  IDLE is a development environment that you 
  30. can use to open this module and run it.  IDLE can be started by clicking on:
  31.  
  32.     Start -> All Programs -> Python 2.x -> IDLE
  33.  
  34.  
  35. Two sample classes are included for demonstration purposes.  These can be
  36. used as models for other functions.
  37.  
  38.  
  39. """
  40.  
  41.  
  42. ##########################################
  43. # list your imported modules here.
  44. # If you get import errors, then the modules are not
  45. # present in the environment.  In this case you will have to
  46. # insert the required module in the PFrank install folder.
  47. ##########################################
  48.  
  49. # start of user imported modules
  50. import re
  51. import string
  52. # end of user imported modules.
  53.  
  54.  
  55. ##########################################
  56. # The following modules must always be imported
  57. ##########################################
  58.  
  59. # start of required imported modules
  60. try :
  61.     from SearchRep_init import configurator
  62.     from SearchRepBase import SearchRepBase
  63. except :
  64.     from SearchRep_initStubs import configurator
  65.     from SearchRepBaseStubs import SearchRepBase
  66.  
  67. # end of required imported modules
  68.  
  69.  
  70.  
  71. class UserRenamer1 (SearchRepBase) :
  72.   """ This is a sample renamer class.  The SearchRepLower base class is
  73.   mandatory.
  74.   """
  75.  
  76.   def __init__ (self) :
  77.       
  78.     # call base class initializer.  This is mandatory
  79.     SearchRepBase.__init__(self)
  80.  
  81.  
  82.     # This is the ID string that will appear in the pre-defined command
  83.     # pull down list.  It will also appear in the custom list when
  84.     # inserted.  The id will also be used in the scan summary
  85.     # The name 'self.idstring' must not change.  Set the assigned string 
  86.     # on the right-hand side of the assignment statement to whatever
  87.     # name you want.
  88.     self.idstring = "(User) - Convert First 6 Chars to Upper"
  89.     
  90.     # this call should remain here
  91.     self.initforscan()
  92.  
  93.  
  94.   def initforscan(self) :
  95.     """
  96.     This function is called whenever a new scan or rescan is made.  Use it to
  97.     reset anything that needs to be reinitialized before a scan.
  98.     This function is mandatory.
  99.     """
  100.     pass
  101.       
  102.  
  103.  
  104.   def fixnames(self, filename) :
  105.     """
  106.     This function converts name of file to a new name.
  107.       Input:  string representing the old filename or portion (either All, Prefix, or Extension)
  108.               The name does not include the path to the file.
  109.       Output: change indicator
  110.                   True if change to input string occurred, otherwise False
  111.               string representing the new filename
  112.  
  113.     
  114.     When the old filename string is passed into this routine, then depending
  115.     on where this user command is placed in the custom list, the string could
  116.     be in the middle of a transformation.  
  117.  
  118.     e.g. if the original filename was ABCDEF.jpg, and the first command of the
  119.     custom list inserted a counter in front of the name, and the second command 
  120.     was this user command, then the filename string that is passed in could be 
  121.     something like 0010-ABCDEF.jpg.
  122.     This name of course no longer looks like the original name.
  123.     
  124.     If you needed to extract meta data from the file, then you would not be able to
  125.     use the passed in string.  Therefore the global variable 'configurator.filename' is
  126.     provided which has the full path to the filename.  You can then just open that name, 
  127.     extract the meta data, and then close the file. 
  128.     """
  129.  
  130.  
  131.     # full path to original filename
  132.     fullPathForFile = configurator.filename
  133.  
  134.     #########################################################################
  135.     # Insert code to modify the filename here
  136.     #########################################################################
  137.  
  138.     # here's some sample code to convert the first 6 characters of a name
  139.     # to upper case.
  140.     if len(filename) >= 7 :
  141.         first6 = filename[0:6]
  142.         remainder = filename[6:]
  143.         newname = first6.upper() + remainder
  144.     else :
  145.         # file is 6 chars long or less
  146.         newname = filename.upper()
  147.  
  148.  
  149.     #########################################################################
  150.     # these statements are mandatory
  151.     #########################################################################
  152.     change = False
  153.     if filename != newname :
  154.         change = True
  155.     return change, newname
  156.  
  157.     # end of the class definition for Renamer1
  158.  
  159.     
  160.  
  161. class UserRenamer2 (SearchRepBase) :
  162.   """ This is a sample renamer class.  The SearchRepLower base class is
  163.   mandatory.
  164.   """
  165.  
  166.   def __init__ (self) :
  167.       
  168.     # call base class initializer.  This is mandatory
  169.     SearchRepBase.__init__(self)
  170.  
  171.  
  172.     # This is the ID string that will appear in the pre-defined command
  173.     # pull down list.  It will also appear in the custom list when
  174.     # inserted.  The id will also be used in the scan summary
  175.     # The name 'self.idstring' must not change.  Set the assigned string 
  176.     # on the right-hand side of the assignment statement to whatever
  177.     # name you want.
  178.     self.idstring = "(User) - Add 1.1 to First Number"
  179.     
  180.  
  181.     self.firstNumber = re.compile(r"""
  182.       ^(.*?)([0-9]+)(.*)$    # look for number in middle of string
  183.     """, re.VERBOSE)
  184.    
  185.     # this call should remain here
  186.     self.initforscan()
  187.  
  188.  
  189.   def initforscan(self) :
  190.     """
  191.     This function is called whenever a new scan or rescan is made.  Use it to
  192.     reset anything that needs to be reinitialized before a scan.
  193.     This function is mandatory.
  194.     """
  195.     pass
  196.  
  197.  
  198.   def fixnames(self, filename) :
  199.     """
  200.     This function converts name of file to a new name.
  201.       Input:  string representing the old filename or portion (either All, Prefix, or Extension)
  202.               The name does not include the path to the file.
  203.       Output: change indicator
  204.                   True if change to input string occurred, otherwise False
  205.               string representing the new filename
  206.  
  207.     
  208.     When the old filename string is passed into this routine, then depending
  209.     on where this user command is placed in the custom list, the string could
  210.     be in the middle of a transformation.  
  211.  
  212.     e.g. if the original filename was ABCDEF.jpg, and the first command of the
  213.     custom list inserted a counter in front of the name, and the second command 
  214.     was this user command, then the filename string that is passed in could be 
  215.     something like 0010-ABCDEF.jpg.
  216.     This name of course no longer looks like the original name.
  217.     
  218.     If you needed to extract meta data from the file, then you would not be able to
  219.     use the passed in string.  Therefore the global variable 'configurator.filename' is
  220.     provided which has the full path to the filename.  You can then just open that name, 
  221.     extract the meta data, and then close the file. 
  222.     """
  223.  
  224.  
  225.     # full path to original filename
  226.     fullPathForFile = configurator.filename
  227.  
  228.     #########################################################################
  229.     # Insert code to modify the filename here
  230.     #########################################################################
  231.  
  232.     # here's some sample code to add 1.1 to the first number found in a name.
  233.     newname = filename
  234.     groups = self.firstNumber.findall(filename)
  235.     #print groups
  236.     if groups != [] :
  237.         if len(groups[0]) == 3 :
  238.             if groups[0][1] != '' :
  239.                 # should be a number
  240.                 number = float (groups[0][1])
  241.                 number += 1.1
  242.                 newnumber = str(number)
  243.                 # recreate filename with calculated number
  244.                 newname = groups[0][0] + newnumber + groups[0][2]
  245.             
  246.  
  247.     #########################################################################
  248.     # these statements are mandatory
  249.     #########################################################################
  250.     change = False
  251.     if filename != newname :
  252.         change = True
  253.     return change, newname
  254.     # end of the class definition for Renamer2
  255.  
  256.    
  257.  
  258.  
  259.  
  260.  
  261. ###################################################################
  262. # Create the Renamer Objects in a list.  The list is mandatory.  
  263. # The name of the list must not change.
  264. # You can list as many names in the list as you like.  PFrank will try to
  265. # load all of them.  Each name in the list must correspond to the
  266. # name of a user command renaming class.  A name can only appear
  267. # once in the list.
  268. #
  269. # User Command Objects are created with the following syntax:
  270. #     ClassName()
  271. #       i.e. the name of the class followed by ()
  272. ###################################################################
  273. UserRenamerList = [
  274.     UserRenamer1(),   # object created for first user renaming class
  275.     UserRenamer2(),   # object created for second user renaming class
  276.     ]
  277.  
  278.  
  279.  
  280.  
  281. ######################################
  282. # Code for testing the renamer objects
  283. ######################################
  284. if  __name__ == '__main__' :
  285.   """
  286.   This is some test code to test the renaming objects.  Test the code using
  287.   the python IDLE tool to verify that things work.  Then try importing the file
  288.   to PFrank
  289.   """
  290.   import os
  291.   userpath = os.getcwd()
  292.   userpath = os.path.normpath(userpath)
  293.  
  294.   print "\
  295. ***NOTICE: Before first editing a user command file, you might need to \n\
  296. associate an editor with .py files to prevent the unintentional execution \n\
  297. of the user command file when trying to edit it.\n\
  298. If the association is not made with an editor, the command window you\n\
  299. are looking at now will shortly disappear!\n\
  300. The user command file is called PFRankUser.py and is located at:\n\
  301. %s\n\n\
  302. After this association is made, you can delete this notice and the timed \n\
  303. delay which follows.\n\
  304. "%userpath
  305.   import time 
  306.   time.sleep(12)
  307.  
  308.   
  309.   print "Testing User Defined Renaming Classes"
  310.  
  311.   # this is a table of sample filenames for testing
  312.   # Assume that the files are in the current folder.
  313.   nameTable = [
  314.       "TestFile.txt",
  315.       "TestFile1.jpg",
  316.       "Test32File3.mp3",
  317.       "Test1.mp3",
  318.       "33T.ogg"
  319.       ]
  320.  
  321.   for renamer in UserRenamerList :
  322.       print "*************Testing Renamer: ", renamer.idstring
  323.       for name in nameTable :
  324.       fullpath = os.path.join(os.getcwd(), name)
  325.       configurator.filename = os.path.normpath(fullpath)
  326.  
  327.           change, newname = renamer.fixnames(name)
  328.           print  "Oldname is: ", name
  329.           print  "Newname is: ", newname
  330.           assert  (change == (not name == newname))
  331.           print ""
  332.       
  333.  
  334.  
  335.  
  336.